In [1]:
# NASA SARP – Final  Python Utilities


# Run once if needed:
!pip install xarray tqdm plotly folium geopandas shapely missingno joblib scikit-learn wordcloud rich pyproj geopy openpyxl pyarrow duckdb altair netCDF4 h5netcdf earthaccess

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import xarray as xr
import altair as alt
import duckdb

from datetime import timedelta
from tqdm import tqdm
import plotly.express as px
import missingno as msno
from shapely.geometry import Point
import geopandas as gpd
from joblib import Parallel, delayed
from scipy import stats
from sklearn.preprocessing import StandardScaler
from wordcloud import WordCloud
from rich import print as rprint
import calendar
from pyproj import Geod
from geopy.distance import geodesic
import folium
import netCDF4 as nc
import earthaccess
from IPython.display import IFrame

sns.set(style="whitegrid")
plt.rcParams["figure.figsize"] = (10, 5)

# 1. tqdm Progress bar
print("Progress bar running...")
for _ in tqdm(range(100)):
    pass

# 2. Plotly interactive scatter
#print("Plotly interactive scatter:")
#iris = px.data.iris()
#fig = px.scatter(iris, x="sepal_width", y="sepal_length", color="species", size="petal_length")
#fig.show()

# 3. missingno matrix
print("Missing data matrix:")
sample_df = pd.DataFrame({
    "A": [1, 2, np.nan, 4],
    "B": [np.nan, 2, 3, 4],
    "C": [1, np.nan, np.nan, 4]
})
msno.matrix(sample_df)
plt.title("Missing Data Matrix")
plt.show()

# 4. WordCloud
print("Generating WordCloud...")
text = "NASA SARP ocean land aerosol research AI Earth satellite observation model science air pollution detection system"
wordcloud = WordCloud(width=800, height=400, background_color='white').generate(text)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title("WordCloud: Project Themes")
plt.show()

# 5. Distance between two coordinates
coord1 = (37.7749, -122.4194)
coord2 = (34.0522, -118.2437)
print("Distance from SF to LA:", round(geodesic(coord1, coord2).km, 2), "km")

# 6. Rolling average line plot
print("Rolling average plot:")
ts = pd.Series(np.random.randn(100).cumsum())
ts.rolling(window=10).mean().plot(title="Rolling Mean (10-point)")
plt.show()

# 7. T-test
a = np.random.normal(0, 1, 100)
b = np.random.normal(0.5, 1, 100)
_, pval = stats.ttest_ind(a, b)
print("T-test p-value:", round(pval, 4))

# 8. Joblib parallel example
results = Parallel(n_jobs=2)(delayed(np.sqrt)(i) for i in range(1000))
print("Sample result from parallel joblib run:", results[:5])

# 9. Time filtering
print("Filtering last 3 hours from time series:")
time_df = pd.DataFrame({
    "Time": pd.date_range("2024-01-01", periods=10, freq="h"),
    "Value": np.random.rand(10)
})
recent = time_df[time_df['Time'] > time_df['Time'].max() - timedelta(hours=3)]
print(recent)

# 10. Boxplot and Pairplot
print("Plotting Boxplot and Pairplot...")
sns.boxplot(data=iris.drop(columns='species'))
plt.title("Boxplot of Iris Features")
plt.show()

sns.pairplot(iris, hue="species")
plt.suptitle("Pairplot of Iris Dataset", y=1.02)
plt.show()

# 11. Normalize with sklearn
scaler = StandardScaler()
scaled = scaler.fit_transform(iris.drop(columns="species"))
print("Scaled values preview:")
print(pd.DataFrame(scaled, columns=iris.columns[:-1]).head())

# 12. Print Calendar
print("Calendar - July 2025")
print(calendar.month(2025, 7))

# 13. GeoPandas basic point map
print("Plotting GeoPandas point:")
gdf = gpd.GeoDataFrame(geometry=[Point(-120.0, 35.0)])
gdf.plot()
plt.title("Single Point GeoPandas Plot")
plt.show()

# 14. Rich output
rprint("[bold green]NASA Python Utility Toolkit Loaded[/bold green]")

# 15. Save to Excel and Parquet
df = pd.DataFrame(np.random.rand(5, 3), columns=["X", "Y", "Z"])
df.to_excel("example_output.xlsx", index=False)
df.to_parquet("example_output.parquet", index=False)
print("Saved Excel and Parquet outputs.")

# 16. Styled DataFrame
iris.head().style.background_gradient(cmap="YlGnBu")

# 17. Quick stats and heatmap
print("Descriptive stats:")
print(iris.describe())

print("Column info:")
iris.info()

sns.heatmap(iris.drop(columns='species').corr(), annot=True, cmap="coolwarm")
plt.title("Feature Correlation Heatmap")
plt.show()

# 18. Save Folium map
print("Saving basic Folium map...")
m = folium.Map(location=[37.7749, -122.4194], zoom_start=5)
for name, lat, lon in [("SF", 37.7749, -122.4194), ("LA", 34.0522, -118.2437)]:
    folium.Marker(location=[lat, lon], popup=name).add_to(m)
m.save("map_output.html")
IFrame("map_output.html", width=800, height=600)

# 19. Altair chart
print("Altair chart:")
alt_chart = alt.Chart(iris).mark_circle().encode(
    x='sepal_length', y='sepal_width', color='species'
).interactive()
alt_chart.show()

# 20. DuckDB query
print("DuckDB summary:")
duckdb_df = duckdb.query("SELECT species, AVG(sepal_length) AS avg_length FROM iris GROUP BY species").to_df()
print(duckdb_df)

# 21. netCDF dataset inspection
print("Opening NOAA dataset via netCDF...")
nc_file = nc.Dataset("https://psl.noaa.gov/thredds/dodsC/Datasets/ncep.reanalysis/surface/air.sig995.2023.nc")
print("Sample variable names:", list(nc_file.variables.keys())[:5])

# 22. EarthAccess login + search
print("Logging into NASA Earthdata...")
#earthaccess.login(strategy="interactive", persist=True)
#results = earthaccess.search_data(short_name="MODIS_A-JPL-L2P-v2019.0", bounding_box=(-5, 85, 5, 89))
print("MODIS granules found:", len(results))

# 23. Heatmap on Folium
print("Creating Folium heatmap...")
m = folium.Map(location=[36.0, -119.0], zoom_start=6)
from folium.plugins import HeatMap
heatmap_data = [(34.05, -118.25, 0.8), (36.16, -115.14, 0.6), (37.77, -122.42, 0.7)]
HeatMap(heatmap_data).add_to(m)
m.save("folium_heatmap.html")
IFrame("folium_heatmap.html", width=800, height=600)

# 24. 3D Plotly surface
print("3D surface plot:")
import plotly.graph_objects as go
z = np.random.rand(30, 30)
fig = go.Figure(data=[go.Surface(z=z)])
fig.update_layout(title="Random 3D Surface", autosize=True)
fig.show()

# 25. KDE plot by species
print("KDE plots by species:")
for species in iris["species"].unique():
    sns.kdeplot(data=iris[iris["species"] == species], x="sepal_length", label=species)
plt.title("Sepal Length Density by Species")
plt.legend()
plt.show()

# Additional  Visualizations (Maps, 3D, Animations)


# 1. Folium Heatmap (Interactive Map with Heat Points)
print("1. Creating interactive Folium heatmap...")
from folium.plugins import HeatMap
import folium
from IPython.display import IFrame

m_heat = folium.Map(location=[36.0, -119.0], zoom_start=6)
heatmap_data = [
    (34.05, -118.25, 0.8),  # Los Angeles
    (36.16, -115.14, 0.6),  # Las Vegas
    (37.77, -122.42, 0.7)   # San Francisco
]
HeatMap(heatmap_data).add_to(m_heat)
m_heat.save("folium_heatmap.html")
print("Saved as folium_heatmap.html")
IFrame("folium_heatmap.html", width=800, height=600)


# 3. Altair Interactive Scatter Plot
print("3. Displaying interactive scatter with Altair...")
import altair as alt
alt_chart = alt.Chart(iris).mark_circle().encode(
    x='sepal_length',
    y='sepal_width',
    color='species'
).interactive()
alt_chart.show()

# 4. Seaborn FacetGrid (Side-by-side histograms)
print("4. Displaying Seaborn facet grid...")
import seaborn as sns
g = sns.FacetGrid(iris, col="species")
g.map_dataframe(sns.histplot, x="sepal_length")

# 5. Matplotlib Animation
print("5. Running animated line plot...")
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()
line, = ax.plot([], [])
ax.set_xlim(0, 50)
ax.set_ylim(0, 1)

def update(frame):
    line.set_data(np.arange(frame), np.random.rand(frame))
    return line,

ani = animation.FuncAnimation(fig, update, frames=50, interval=100)
plt.title("Animated Line Plot")
plt.show()

# 6. Plotly Scatter Matrix
print("6. Showing interactive scatter matrix...")
import plotly.express as px
fig = px.scatter_matrix(iris, dimensions=iris.columns[:-1], color="species")
fig.update_layout(title="Scatter Matrix: Iris Features")
fig.show()

# 7. Plotly Interactive Bar Chart
print("7. Plotting grouped bar chart by species...")
df_bar = iris.groupby("species").mean().reset_index()
fig = px.bar(df_bar, x="species", y="sepal_length", title="Average Sepal Length per Species")
fig.show()

# 8. Seaborn KDE Density Plot by Group
print("8. KDE Density plot of Sepal Length by Species...")
for species in iris["species"].unique():
    sns.kdeplot(data=iris[iris["species"] == species], x="sepal_length", label=species)
plt.title("Sepal Length Density by Species")
plt.legend()
plt.show()

#----
import folium
from IPython.display import IFrame, display

# Create map
m = folium.Map(location=[37.7749, -122.4194], zoom_start=6)

# Add markers
folium.Marker([37.7749, -122.4194], popup="San Francisco").add_to(m)
folium.Marker([34.0522, -118.2437], popup="Los Angeles").add_to(m)
m
# Save map
m.save("folium_map.html")

# Display map in Deepnote
#display(IFrame("folium_map.html", width=800, height=600))

#-----

!pip install cartopy rioxarray plotly

# NASA SARP Visual Demo

import warnings
warnings.filterwarnings("ignore")

import xarray as xr
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

try:
    import cartopy.crs as ccrs
    import cartopy.feature as cfeature
except:
    print("Cartopy import failed.")

try:
    import plotly.graph_objects as go
except:
    print("Plotly import failed.")

# 1. NOAA Dataset
print("Loading NOAA air temperature dataset...")
try:
    ds = xr.open_dataset("https://psl.noaa.gov/thredds/dodsC/Datasets/ncep.reanalysis/surface/air.sig995.2020.nc")
    air = ds['air'].sel(time='2020-01-01')
    air_sub = air.isel(lat=slice(0, 50), lon=slice(0, 50))
    print("Air data loaded.")
except Exception as e:
    print("Failed to load air data:", e)

# 2. Fixed Cartopy
print("Plotting Cartopy map...")
try:
    fig = plt.figure(figsize=(10, 5))
    ax = plt.axes(projection=ccrs.PlateCarree())
    im = ax.contourf(air.lon, air.lat, air.values[0], transform=ccrs.PlateCarree(), cmap='coolwarm')
    ax.coastlines()
    ax.add_feature(cfeature.BORDERS)
    plt.colorbar(im, ax=ax, orientation='vertical', label='Temp (K)')
    plt.title("Surface Air Temp (Jan 1, 2020)")
    plt.tight_layout()
    plt.show()
except Exception as e:
    print("Cartopy failed:", e)

# 3. Fixed Bathymetry with x/y decoding
print("Plotting bathymetry...")
try:
    bathy_ds = xr.open_dataset("https://www.ngdc.noaa.gov/thredds/dodsC/crm/crm_vol1.nc")
    bathy = bathy_ds['z']
    x = bathy_ds['x']
    y = bathy_ds['y']
    bathy_sub = bathy.isel(x=slice(10000, 10500), y=slice(4000, 4500))
    plt.figure(figsize=(8, 6))
    plt.contourf(x[slice(10000, 10500)], y[slice(4000, 4500)], bathy_sub.values, cmap='terrain')
    plt.title("US Coastal Bathymetry (Subset)")
    plt.xlabel("Longitude")
    plt.ylabel("Latitude")
    plt.colorbar(label="Elevation (m)")
    plt.tight_layout()
    plt.show()
except Exception as e:
    print("Bathymetry failed:", e)

# 4. Animation at fixed lat/lon
print("Animating daily temperature at 30N, 240E...")
try:
    ts = ds['air'].sel(lat=30, lon=240, method='nearest')
    fig, ax = plt.subplots()
    line, = ax.plot([], [], lw=2)
    ax.set_xlim(0, len(ts.time))
    ax.set_ylim(float(ts.min()), float(ts.max()))
    ax.set_title("Daily Air Temp (30N, 240E) — 2020")
    ax.set_xlabel("Day")
    ax.set_ylabel("Temp (K)")

    def init(): line.set_data([], []); return line,
    def animate(i): line.set_data(np.arange(i), ts.values[:i]); return line,

    ani = animation.FuncAnimation(fig, animate, init_func=init, frames=len(ts.time), interval=50, blit=True)
    plt.show()
except Exception as e:
    print("Animation failed:", e)

# 5. Plotly 3D
print("Plotting interactive 3D surface...")
try:
    air_3d = air_sub.values[0] if len(air_sub.shape) == 3 else air_sub.values
    fig = go.Figure(data=[go.Surface(z=air_3d, x=air_sub.lon, y=air_sub.lat, colorscale='Viridis')])
    fig.update_layout(title='3D Temp Surface', autosize=False, width=800, height=600)
    fig.show()
except Exception as e:
    print("Plotly 3D failed:", e)

# Make sure correct version of leafmap is installed


## Install required packages (if not already installed)
#!pip install -q leafmap ipywidgets
#
#import leafmap
#import ipywidgets as widgets
#from ipyleaflet import TileLayer, Rectangle
#from IPython.display import display
#
## Create interactive map centered over the US
#m = leafmap.Map(center=[37.5, -95], zoom=4)
#
## Add real satellite basemaps
#basemaps = [
#    "Esri.WorldImagery",         # High-res Satellite
#    "Esri.NatGeoWorldMap",       # National Geographic
#    "Esri.WorldTopoMap",         # Topography
#    "USGS.USTopo",               # USGS Topo
#    "CartoDB.Positron",          # Light gray
#    "CartoDB.DarkMatter"         # Dark theme
#]
#
#for bmap in basemaps:
#    m.add_basemap(bmap)
#
## Add GeoJSON layer with US cities
#geojson_url = "https://raw.githubusercontent.com/giswqs/leafmap/master/examples/data/us_cities.geojson"
#m.add_geojson(geojson_url, layer_name="US Cities")
#
## Add a marker with HTML popup
#popup = widgets.HTML(value="<b>San Francisco</b>")
#m.add_marker(location=(37.7749, -122.4194), popup=popup)
#
## Add MODIS daily imagery (e.g., MODIS Terra)
#modis = TileLayer(
#    url="https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_CorrectedReflectance_TrueColor/default/2020-07-01/GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg",
#    name="MODIS Terra Reflectance (True Color)",
#    attribution="NASA MODIS",
#    opacity=0.6
#)
#m.add_layer(modis)
#
## Add NASA Blue Marble imagery
#blue_marble = TileLayer(
#    url="https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/BlueMarble_ShadedRelief_Bathymetry/default/2020-01-01/GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg",
#    name="NASA Blue Marble",
#    attribution="NASA Blue Marble",
#    opacity=0.6
#)
#m.add_layer(blue_marble)
#
## Add bounding box (example: around Southern California)
#bbox = Rectangle(
#    bounds=[[32.5, -124], [34.5, -118]],
#    color="red",
#    fill_opacity=0.2,
#    name="Southern California BBox"
#)
#m.add_layer(bbox)
#
## Add drawing tools
#m.add_draw_control()
#
## Display the interactive map
#m


print("All plots attempted.")
Requirement already satisfied: tqdm in /srv/conda/envs/notebook/lib/python3.11/site-packages (4.67.1)
Requirement already satisfied: plotly in /srv/conda/envs/notebook/lib/python3.11/site-packages (5.18.0)
Requirement already satisfied: folium in /srv/conda/envs/notebook/lib/python3.11/site-packages (0.19.5)
Requirement already satisfied: geopandas in /srv/conda/envs/notebook/lib/python3.11/site-packages (1.0.1)
Requirement already satisfied: shapely in /srv/conda/envs/notebook/lib/python3.11/site-packages (2.0.6)
Requirement already satisfied: missingno in /srv/conda/envs/notebook/lib/python3.11/site-packages (0.5.2)
Requirement already satisfied: joblib in /srv/conda/envs/notebook/lib/python3.11/site-packages (1.1.1)
Requirement already satisfied: scikit-learn in /srv/conda/envs/notebook/lib/python3.11/site-packages (1.3.2)
Requirement already satisfied: wordcloud in /srv/conda/envs/notebook/lib/python3.11/site-packages (1.9.4)
Requirement already satisfied: rich in /srv/conda/envs/notebook/lib/python3.11/site-packages (14.0.0)
Requirement already satisfied: pyproj in /srv/conda/envs/notebook/lib/python3.11/site-packages (3.7.1)
Requirement already satisfied: geopy in /srv/conda/envs/notebook/lib/python3.11/site-packages (2.4.1)
Requirement already satisfied: openpyxl in /srv/conda/envs/notebook/lib/python3.11/site-packages (3.1.5)
Requirement already satisfied: pyarrow in /srv/conda/envs/notebook/lib/python3.11/site-packages (15.0.2)
Requirement already satisfied: duckdb in /srv/conda/envs/notebook/lib/python3.11/site-packages (1.2.1)
Requirement already satisfied: altair in /srv/conda/envs/notebook/lib/python3.11/site-packages (5.5.0)
Requirement already satisfied: netCDF4 in /srv/conda/envs/notebook/lib/python3.11/site-packages (1.7.2)
Requirement already satisfied: h5netcdf in /srv/conda/envs/notebook/lib/python3.11/site-packages (1.3.0)
Requirement already satisfied: earthaccess in /srv/conda/envs/notebook/lib/python3.11/site-packages (0.10.0)
Requirement already satisfied: tenacity>=6.2.0 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from plotly) (9.1.2)
Requirement already satisfied: packaging in /srv/conda/envs/notebook/lib/python3.11/site-packages (from plotly) (24.2)
Requirement already satisfied: branca>=0.6.0 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from folium) (0.8.1)
Requirement already satisfied: jinja2>=2.9 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from folium) (3.1.5)
Requirement already satisfied: numpy in /srv/conda/envs/notebook/lib/python3.11/site-packages (from folium) (1.26.4)
Requirement already satisfied: requests in /srv/conda/envs/notebook/lib/python3.11/site-packages (from folium) (2.32.3)
Requirement already satisfied: xyzservices in /srv/conda/envs/notebook/lib/python3.11/site-packages (from folium) (2025.1.0)
Requirement already satisfied: pyogrio>=0.7.2 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from geopandas) (0.10.0)
Requirement already satisfied: pandas>=1.4.0 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from geopandas) (2.2.3)
Requirement already satisfied: matplotlib in /srv/conda/envs/notebook/lib/python3.11/site-packages (from missingno) (3.9.1)
Requirement already satisfied: scipy in /srv/conda/envs/notebook/lib/python3.11/site-packages (from missingno) (1.15.2)
Requirement already satisfied: seaborn in /srv/conda/envs/notebook/lib/python3.11/site-packages (from missingno) (0.13.2)
Requirement already satisfied: threadpoolctl>=2.0.0 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from scikit-learn) (3.6.0)
Requirement already satisfied: pillow in /srv/conda/envs/notebook/lib/python3.11/site-packages (from wordcloud) (10.2.0)
Requirement already satisfied: markdown-it-py>=2.2.0 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from rich) (3.0.0)
Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from rich) (2.19.1)
Requirement already satisfied: certifi in /srv/conda/envs/notebook/lib/python3.11/site-packages (from pyproj) (2024.12.14)
Requirement already satisfied: geographiclib<3,>=1.52 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from geopy) (2.0)
Requirement already satisfied: et-xmlfile in /srv/conda/envs/notebook/lib/python3.11/site-packages (from openpyxl) (2.0.0)
Requirement already satisfied: jsonschema>=3.0 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from altair) (4.23.0)
Requirement already satisfied: narwhals>=1.14.2 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from altair) (1.47.0)
Requirement already satisfied: typing-extensions>=4.10.0 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from altair) (4.12.2)
Requirement already satisfied: cftime in /srv/conda/envs/notebook/lib/python3.11/site-packages (from netCDF4) (1.6.4)
Requirement already satisfied: h5py in /srv/conda/envs/notebook/lib/python3.11/site-packages (from h5netcdf) (3.13.0)
Requirement already satisfied: fsspec>=2022.11 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from earthaccess) (2025.3.2)
Requirement already satisfied: importlib-resources>=6.3.2 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from earthaccess) (6.5.2)
Requirement already satisfied: multimethod>=1.8 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from earthaccess) (2.0)
Requirement already satisfied: pqdm>=0.1 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from earthaccess) (0.2.0)
Requirement already satisfied: python-cmr>=0.10.0 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from earthaccess) (0.13.0)
Requirement already satisfied: s3fs>=2022.11 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from earthaccess) (2025.3.2)
Requirement already satisfied: tinynetrc<2.0.0,>=1.3.1 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from earthaccess) (1.3.1)
Requirement already satisfied: MarkupSafe>=2.0 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from jinja2>=2.9->folium) (2.1.5)
Requirement already satisfied: attrs>=22.2.0 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from jsonschema>=3.0->altair) (25.1.0)
Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from jsonschema>=3.0->altair) (2024.10.1)
Requirement already satisfied: referencing>=0.28.4 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from jsonschema>=3.0->altair) (0.36.2)
Requirement already satisfied: rpds-py>=0.7.1 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from jsonschema>=3.0->altair) (0.24.0)
Requirement already satisfied: mdurl~=0.1 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from markdown-it-py>=2.2.0->rich) (0.1.2)
Requirement already satisfied: python-dateutil>=2.8.2 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from pandas>=1.4.0->geopandas) (2.9.0)
Requirement already satisfied: pytz>=2020.1 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from pandas>=1.4.0->geopandas) (2024.1)
Requirement already satisfied: tzdata>=2022.7 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from pandas>=1.4.0->geopandas) (2025.2)
Requirement already satisfied: bounded-pool-executor in /srv/conda/envs/notebook/lib/python3.11/site-packages (from pqdm>=0.1->earthaccess) (0.0.3)
Requirement already satisfied: charset_normalizer<4,>=2 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from requests->folium) (3.4.1)
Requirement already satisfied: idna<4,>=2.5 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from requests->folium) (3.10)
Requirement already satisfied: urllib3<3,>=1.21.1 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from requests->folium) (1.26.19)
Requirement already satisfied: aiobotocore<3.0.0,>=2.5.4 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from s3fs>=2022.11->earthaccess) (2.21.1)
Requirement already satisfied: aiohttp!=4.0.0a0,!=4.0.0a1 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from s3fs>=2022.11->earthaccess) (3.11.16)
Requirement already satisfied: contourpy>=1.0.1 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from matplotlib->missingno) (1.3.1)
Requirement already satisfied: cycler>=0.10 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from matplotlib->missingno) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from matplotlib->missingno) (4.57.0)
Requirement already satisfied: kiwisolver>=1.3.1 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from matplotlib->missingno) (1.4.7)
Requirement already satisfied: pyparsing>=2.3.1 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from matplotlib->missingno) (3.2.3)
Requirement already satisfied: aioitertools<1.0.0,>=0.5.1 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from aiobotocore<3.0.0,>=2.5.4->s3fs>=2022.11->earthaccess) (0.12.0)
Requirement already satisfied: botocore<1.37.2,>=1.37.0 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from aiobotocore<3.0.0,>=2.5.4->s3fs>=2022.11->earthaccess) (1.37.1)
Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from aiobotocore<3.0.0,>=2.5.4->s3fs>=2022.11->earthaccess) (1.0.1)
Requirement already satisfied: multidict<7.0.0,>=6.0.0 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from aiobotocore<3.0.0,>=2.5.4->s3fs>=2022.11->earthaccess) (6.3.2)
Requirement already satisfied: wrapt<2.0.0,>=1.10.10 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from aiobotocore<3.0.0,>=2.5.4->s3fs>=2022.11->earthaccess) (1.17.2)
Requirement already satisfied: aiohappyeyeballs>=2.3.0 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs>=2022.11->earthaccess) (2.6.1)
Requirement already satisfied: aiosignal>=1.1.2 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs>=2022.11->earthaccess) (1.3.2)
Requirement already satisfied: frozenlist>=1.1.1 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs>=2022.11->earthaccess) (1.5.0)
Requirement already satisfied: propcache>=0.2.0 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs>=2022.11->earthaccess) (0.2.1)
Requirement already satisfied: yarl<2.0,>=1.17.0 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs>=2022.11->earthaccess) (1.18.3)
Requirement already satisfied: six>=1.5 in /srv/conda/envs/notebook/lib/python3.11/site-packages (from python-dateutil>=2.8.2->pandas>=1.4.0->geopandas) (1.17.0)
Progress bar running...
100%|██████████| 100/100 [00:00<00:00, 828913.83it/s]
Plotly interactive scatter:
/srv/conda/envs/notebook/lib/python3.11/site-packages/plotly/express/_core.py:2065: FutureWarning: When grouping with a length-1 list-like, you will need to pass a length-1 tuple to get_group in a future version of pandas. Pass `(name,)` instead of `name` to silence this warning.
  sf: grouped.get_group(s if len(s) > 1 else s[0])
Missing data matrix:
No description has been provided for this image
Generating WordCloud...
No description has been provided for this image
Distance from SF to LA: 559.04 km
Rolling average plot:
No description has been provided for this image
T-test p-value: 0.0008
Sample result from parallel joblib run: [0.0, 1.0, 1.4142135623730951, 1.7320508075688772, 2.0]
Filtering last 3 hours from time series:
                 Time     Value
7 2024-01-01 07:00:00  0.949718
8 2024-01-01 08:00:00  0.675527
9 2024-01-01 09:00:00  0.051672
Plotting Boxplot and Pairplot...
No description has been provided for this image
No description has been provided for this image
Scaled values preview:
   sepal_length  sepal_width  petal_length  petal_width   species
0     -0.900681     1.032057     -1.341272    -1.312977 -1.224745
1     -1.143017    -0.124958     -1.341272    -1.312977 -1.224745
2     -1.385353     0.337848     -1.398138    -1.312977 -1.224745
3     -1.506521     0.106445     -1.284407    -1.312977 -1.224745
4     -1.021849     1.263460     -1.341272    -1.312977 -1.224745
Calendar - July 2025
     July 2025
Mo Tu We Th Fr Sa Su
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

Plotting GeoPandas point:
No description has been provided for this image
NASA Python Utility Toolkit Loaded
Saved Excel and Parquet outputs.
Descriptive stats:
       sepal_length  sepal_width  petal_length  petal_width  species_id
count    150.000000   150.000000    150.000000   150.000000  150.000000
mean       5.843333     3.054000      3.758667     1.198667    2.000000
std        0.828066     0.433594      1.764420     0.763161    0.819232
min        4.300000     2.000000      1.000000     0.100000    1.000000
25%        5.100000     2.800000      1.600000     0.300000    1.000000
50%        5.800000     3.000000      4.350000     1.300000    2.000000
75%        6.400000     3.300000      5.100000     1.800000    3.000000
max        7.900000     4.400000      6.900000     2.500000    3.000000
Column info:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 6 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   sepal_length  150 non-null    float64
 1   sepal_width   150 non-null    float64
 2   petal_length  150 non-null    float64
 3   petal_width   150 non-null    float64
 4   species       150 non-null    object 
 5   species_id    150 non-null    int64  
dtypes: float64(4), int64(1), object(1)
memory usage: 7.2+ KB
No description has been provided for this image
Saving basic Folium map...
Altair chart:
DuckDB summary:
      species  avg_length
0  versicolor       5.936
1   virginica       6.588
2      setosa       5.006
Opening NOAA dataset via netCDF...
Sample variable names: ['lat', 'lon', 'time', 'air']
Logging into NASA Earthdata...
MODIS granules found: 1000
Creating Folium heatmap...
3D surface plot:
KDE plots by species:
No description has been provided for this image
In [ ]: